home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
ftp.whtech.com
/
ftp.whtech.com.tar
/
ftp.whtech.com
/
datasheets and manuals
/
Hardware
/
WHT
/
scsi
/
dsr_sources_2_2001
/
openou
< prev
next >
Wrap
Text File
|
2006-10-19
|
12KB
|
518 lines
**
*
* OPEN OUTPUT
*
* Here is where we open a file for output. If the
* file aready exists, make sure it's not protected
* and has all the same attributes of the file we
* want to open. I no longer deallocate the AU's.
*
* If the file does not exist, see if the directory
* exists. If it does, then create a new entry in
* the file index
*
**
OPENOU
BL @GETFDR See if the file already exists
CI R5,0
JNE OOU1
B @OOU20
* The file exists
*
OOU1
LDCR @ZERO,4 Select RAM bank 0
MOV @12(R5),R1 Get file flags
COC @PROBIT,R1
JNE OOU2
BL @DSRERR File protected - error
DATA >0100
OOU2
ANDI R1,>0100 Check for Data/Program
JEQ OOU3
OOUBAD BL @DSRERR
DATA >0200 Bad open attribute
OOU3 MOV @12(R5),R1 Check Fixed/variable
ANDI R1,>8000
MOVB @PABBUF+1,R2
ANDI R2,>1000
SLA R2,3
C R1,R2
JNE OOUBAD
MOVB @12(R5),R1 Check Display/Internal
ANDI R1,>0200
MOVB @PABBUF+1,R2
ANDI R2,>0800
SRL R2,2
C R1,R2
JNE OOUBAD
* Now compare record length. If no record length was
* specified, we can continue.
*
MOVB @PABBUF+4,R2
JEQ OOU4
CB R2,@17(R5)
JNE OOUBAD
OOU4
* Set up the file cache entry
BL @OSCASH
* Reset a few fields in the FDR
*
LDCR @ZERO,4
* CLR @14(R5) Number of sectors currently allocated
MOVB @ZERO,@16(R5) End of file offset
CLR @18(R5) Number of level 3 records allocated
* Write the FDR back out to disk
*
LDCR @B04,4 Select RAM bank 4
MOV @SAVEAU,R7
BL @ALOT
SRL R8,1
SRL R7,1
JNC OOU7
AI R8,1
OOU7
BLWP @BANKIT
DATA SCSIWT
JEQ OOU8
BL @DSRERR
DATA >0600 Device error
OOU8
* Copy the FDR to FDR buffer in Bank 5
*
LDCR @B02,4
MOV @4(R4),R1
LI R4,256
OOU9 LDCR @ZERO,4
MOV *R5+,R2
LDCR @B05,4
MOV R2,*R1+
DECT R4
JNE OOU9
LDCR @ZERO,4
B @DSRRT File is open!!!
**
* The specified file does not exist. We will have to make
* a new entry for the file in the file index of the directory
*
**
OOU20
BL @GETDDR Get the parent directory
CI R5,0
JNE OOU21
BL @DSRERR Directory does not exist
DATA >0700 File error
OOU21 LDCR @B03,4 Select RAM bank 3
CB @22(R5),@B127 See if directory is full
JNE OOU22
BL @DSRERR
DATA >0400 Out of space error
OOU22 AB @B01,@22(R5) Increment file counter
* We will now read the DDR and write it back out with the
* number of files incremented by 1. In a perfect world,
* we would try to allocate an AU for the file first.
*
LDCR @B04,4 Select RAM bank 4
MOV @SAVEAU,R7 Get AU of the DDR
BL @ALOT
LI R2,SECBUF
SRL R8,1
JNC OOU23
AI R2,>100
OOU23 SRL R7,1
JNC OOU24
AI R8,>8000
OOU24
BLWP @BANKIT
DATA SCSIRD
JEQ OOU26
OOU25 BL @DSRERR
DATA >0600 Device error
OOU26 AB @B01,@22(R2) Increment file counter
BLWP @BANKIT
DATA SCSIWT
JNE OOU25
* Now we have to place an AU for the FDR in the file index.
* We will do a cut-and-paste from the SAVE procedure. This
* really should be a subprogram since it it duplicated.
*
MOV R5,R0 Save pointer to DDR in memory
* I am hardcoding a value of 256 for AU boundry. I should
* really get this value from the VIB
LI R3,-256
CLR R7
LI R8,1 We want 1 AU
LDCR @ZERO,4 Select RAM bank 0
BLWP @ALLOC
JNE OOU25 Device error
CI R4,0 See if we got no AU's
JNE OOU27
BL @DSRERR
DATA >0400 Out of space
OOU27 LDCR @B02,4 Save AU we got allocated
MOV R5,@SFDRAU
* We now have to do a binary search on all the
* file names in the directory to see where it will go.
*
LDCR @B02,4
LI R2,NCB+39
OOU28 CB *R2,@PERIOD
JEQ OOU29
DEC R2
CI R2,NCB-1
JNE OOU28
OOU29 INC R2
CI R2,NCB+40 Make sure we don't have a 0 length
JNE OOU31 file name
OOU30 BL @DSRERR
DATA >0700 File Error
OOU31 CB *R2,@SPACE
JEQ OOU30
* Now copy the filename to FNCB
*
LI R1,FNCB
OOU32 MOVB *R2+,R3
LDCR @ZERO,4
MOVB R3,*R1+
LDCR @B02,4
CI R2,NCB+40
JEQ OOU33
CB *R2,@SPACE
JNE OOU32
OOU33 LDCR @ZERO,4 Select RAM bank 0
OOU34 CI R1,FNCB+10
JEQ OOU35
MOVB @SPACE,*R1+
JMP OOU34
OOU35
* Now get the file index back so we can insert the AU
* of the new FDR
*
LDCR @B03,4 Select RAM bank 3
MOV R0,R3
MOV @24(R3),R7 Get AU of file index
BL @ALOT
LI R4,SECBUF
SRL R8,1
JNC OOU36
AI R4,>100
OOU36 SRL R7,1
JNC OOU37
AI R8,>8000
OOU37
BLWP @BANKIT Read the index from disk
DATA SCSIRD
JEQ OOU38
BL @DSRERR Signal error
DATA >0600 Device error
OOU38 LI R2,DFDR
LI R3,256
OOU39 MOV *R4+,R5 Copy the index to a buffer
LDCR @B02,4
MOV R5,*R2+
LDCR @ZERO,4
DECT R3
JNE OOU39
* Now we have to search the index and see where our
* new file will fit in alphabetically
*
LDCR @B03,4 Select RAM bank 3
MOV R0,R3
MOVB @22(R3),R1 Get # of files in directory
CLR R0
SRL R1,8
DEC R1 Ignore our own file
JEQ OOU48
DEC R1
OOU40 LDCR @B02,4 Select RAM bank 2
MOV R0,R2 Compute the midpoint
A R1,R2
ANDI R2,>FFFE
MOV @DFDR(R2),R7 Get AU of FDR
LI R4,SECBUF
BL @ALOT
SRL R8,1
JNC OOU41
AI R4,>100
OOU41 SRL R7,1
JNC OOU42
AI R8,>8000
OOU42
* Read the FDR from disk and compare file names
*
BLWP @BANKIT
DATA SCSIRD
JEQ OOU43
BL @DSRERR
DATA >0600 Device Error
OOU43
LI R2,FNCB
OOU44 CB *R4+,*R2+
JL OOU45
JH OOU46
JMP OOU44
OOU45 C R0,R1
JEQ OOU47
MOV R0,R2
A R1,R2
SRL R2,1
MOV R2,R0
INC R0
JMP OOU40
OOU46 C R0,R1
JEQ OOU48
MOV R0,R2
A R1,R2
SRL R2,1
C R2,R0
JEQ OOU48
MOV R2,R1
* JEQ OOU48
DEC R1
JMP OOU40
OOU47 INC R0
OOU48 SLA R0,1
AI R0,DFDR
* Insert the AU of our new FDR into the file index.
*
LDCR @B02,4 Select RAM bank 2
LI R1,DFDR+252
OOU49 C R1,R0
JEQ OOU50
MOV @-2(R1),*R1
DECT R1
JMP OOU49
OOU50 MOV @SFDRAU,*R0 Put in AU of our new FDR in index
* Now write the new file index back out to disk
*
BL @GETDDR Get pointer to DDR back
LDCR @B03,4 Select RAM bank 3
LI R2,SECBUF
MOV @24(R5),R7 Get AU of the file index
BL @ALOT
SRL R8,1
JNC OOU51
AI R2,>100
OOU51 SRL R7,1
JNC OOU52
AI R8,>8000
OOU52
BLWP @BANKIT
DATA SCSIRD
JEQ OOU53
BL @DSRERR
DATA >0600 Device Error
* Now replace the file index in the SCSI buffer
*
OOU53 LI R3,DFDR
LI R1,256
OOU54 LDCR @B02,4 Select RAM bank 2
MOV *R3+,R4
LDCR @ZERO,4 Select RAM bank 0
MOV R4,*R2+
DECT R1
JNE OOU54
BLWP @BANKIT Now write back out to disk
DATA SCSIWT
JEQ OOU55
BL @DSRERR
DATA >0600 Device Error
OOU55
* Now we are going to write out a blank FDR to the disk.
* When we are done writing the contents of the file, we
* will re-write the FDR. I do it this way in case the
* computer crashes when writing the data. We will not
* have a corrupt FDR.
*
* Allocate an entry in the open file cache and build the FDR
* in bank 5.
BL @OSCASH
MOV @SFDRAU,@48(R4) Store the FDR's AU
* Copy the file name into the FDR
MOV @4(R4),R1 Get FDR address
MOVB @2(R4),R10 Get FDR bank
LI R2,FNCB
LI R3,10
OOU59 LDCR @ZERO,4
MOV *R2+,R0
LDCR R10,4 Select the bank the FDR resides in
MOV R0,*R1+
DECT R3
JNE OOU59
OOU61 CLR *R1+ Extended record length
* Here we set the file flags. We only need to set the
* variable/fixed bit and internal/display bit.
CLR R2
LDCR @ZERO,4 Select RAM bank 0
MOVB @PABBUF+1,R0
ANDI R0,>1000
JEQ OOU61A
ORI R2,>8000 Variable length records
OOU61A MOVB @PABBUF+1,R0
ANDI R0,>0800
JEQ OOU61B
ORI R2,>0200 Internal
OOU61B LDCR R10,4
MOVB R2,*R1+ File flags
* Compute the number of records per sector by dividing
* the sector size (256) by record size.
LDCR @ZERO,4
MOVB @PABBUF+4,R0 Get record size
JNE OOU61D
LI R0,80*256 Default record size is 80
OOU61D
SRL R0,8
CLR R7
LI R8,256
DIV R0,R7
LDCR R10,4
SLA R7,8
MOVB R7,*R1+ # of records per sector
CLR *R1+ # of sectors allocated
MOVB @ZERO,*R1+ End of file offset
LDCR @ZERO,4 Get record length
MOVB @PABBUF+4,R0
JNE OOU61C If 0, use the default of 80
MOV @PABADR,R0 Store record length in
AI R0,4 caller's PAB
ORI R0,>4000
SWPB R0
MOVB R0,@VDPWA
SWPB R0
MOVB R0,@VDPWA
MOVB @B80,R0
MOVB R0,@VDPWD
OOU61C
LDCR R10,4
MOVB R0,*R1+
CLR *R1+ Level 3 records allocated
CLR *R1+ Date & Time of creation
CLR *R1+ "
CLR *R1+ Date & Time of update
CLR *R1+ "
LI R0,'FI'
MOV R0,*R1+
CLR *R1+ Pointer to parent AU
CLR *R1+ Pointer to offspring AU
CLR *R1+ # of AUs for this FDR
LDCR @B03,4
MOV @24(R5),R0 Get pointer to FDIR
LDCR R10,4
MOV R0,*R1+ Pointer to FDIR
CLR *R1+ Extended info
OOU62 CLR *R1+ Clear the data chain
MOV R1,R0
ANDI R0,>00FF This is ugly, but I'm in a hurry
JNE OOU62
AI R1,-256 Reset pointer
* Now read the block where the FDR will reside
LDCR @B02,4 Select RAM bank 2
MOV @SFDRAU,R7
BL @ALOT
LI R4,SECBUF
SRL R8,1
JNC OOU63
AI R4,>100
OOU63 SRL R7,1
JNC OOU64
AI R8,>8000
OOU64
BLWP @BANKIT
DATA SCSIRD
JEQ OOU65
BL @DSRERR
DATA >0600 Device Error
* Now copy our FDR to the SCSI buffer
*
OOU65
LI R0,256
OOU66 LDCR @B05,4
MOV *R1+,R3
LDCR @ZERO,4
MOV R3,*R4+
DECT R0
JNE OOU66
AI R1,-256
BLWP @BANKIT Write back out to disk
DATA SCSIWT
JEQ OOU67
BL @DSRERR
DATA >0600 Device Error
OOU67
LDCR @ZERO,4
B @DSRRT Hooray! We're done